<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 一、new 干了什么？

        /* 
            1.创建一个空的简单 JavaScript 对象（即 {}）；
            2.为步骤 1 新创建的对象添加属性 __proto__，将该属性链接至构造函数的原型对象；
            3.将步骤 1 新创建的对象作为 this 的上下文；
            4.如果该函数没有返回对象，则返回 this
        */


        // 二、仿写一个new
        /* 
            1.创建一个空对象
            2.把构造函数的显示原型赋值给这个空对象的隐式原型
            3.把创建的这个对象改成 构造函数里的this
            4.看构造函数里是否有对象返还值，如果有 ，那么自动返还这个对象，如果没有返还值那么就返还构造函数里的this(就是第一步创建的这个空对象);
        */

        function mynew(Fn,...args) {
            // 第一步
            var obj = {};
            // 第二步
            // prototype:显示原型   __proto__隐式原型
            obj.__proto__ = Fn.prototype
            // 第三步
            var res = Fn.call(obj,...args);

            //  第四步
            if (typeof res === "object") {
                return res;
            } else {
                return obj;
            }
        }

        function Person(name) {
            this.name = name;
            // return this;  // 隐式返还this
            // return {name:"123"};
        }
        Person.prototype.fn = function(){
            console.log("fn");
        }

        var zhangsan = mynew(Person,"张三");
        console.log(zhangsan);
        zhangsan.fn();


        // var zhangsan = new Person("张三");
        // console.log(zhangsan);


        // Person.prototype  显示原型

        // var zhangsan = new Person("张三");

        // zhangsan.__proto__
        // console.log(Person.prototype===zhangsan.__proto__);


    </script>
</body>

</html>